package classes;

import java.util.ArrayList;
import java.util.Scanner;

import Exceptions.DadosInsuficientesExceptions;
import Exceptions.SomenteNumerosException;
import classes.*;

public class Main {

	private static Scanner input;	
	private static Cadastra sistema = new Cadastra();

	private static final int NUMBER_OF_OPTIONS1 = 3;
	private static final int NUMBER_OF_OPTIONS2 = 5;

	

	public static void main(String[] args) throws Exception {
		
		input = new Scanner(System.in);

		printHeader();
		int opcao;

		do {
			printMenu();
			opcao = readIntegerOption("> ", 1, NUMBER_OF_OPTIONS1);

			switch (opcao) {
			case 1:
				metodo1();
				break;
			case 2:
				metodo2();
				break;
				
			
				
			default:

				break;
			}

		} while (opcao != NUMBER_OF_OPTIONS1);

		System.out.println("Obrigado!");

	}

	/**
	 * Shows program header.
	 */
	private static void printHeader() {
		// System.out.println("Bem vindo � BTree!\n");
	}

	/**
	 * Show menu options.
	 */
	private static void printMenu() {

		StringBuilder sb = new StringBuilder();
		sb
				.append("-------------- Projeto Sistemas de Informacao ---------------\n");
		sb
				.append("----------------------- iLendCG -----------------------------\n");
		sb
				.append("---------------------Bem vindo ao iLendCG---------------------\n");
		sb.append("\nO que deseja fazer? \n");
		sb.append("1 - Cadastrar Usuario\n");
		sb.append("2 - Login\n");
		sb.append("3 - Sair\n");
		System.out.println(sb.toString());

	}

	/**
	 * Show menu options.
	 */
	private static void printMenu2(Usuario usuarioLogado) {

		StringBuilder sb = new StringBuilder();
		
		sb.append("\nOla " + usuarioLogado.getNome() +"! \n");
		sb.append("\nO que deseja fazer? \n");
		sb.append("1 - Buscar Usuario\n");
		sb.append("2 - Cadastrar Items\n");
		sb.append("3 - chamando a parada\n");
		sb.append("4 - Sair\n");

		System.out.println(sb.toString());

	}
	

	private static int readIntegerOption(String message, int lowerLimit,
			int upperLimit) {
		while (true) {
			try {
				System.out.print(message);
				Integer number = 0;
				do {
					number = Integer.valueOf(input.nextLine());
				} while (number < lowerLimit || number > upperLimit);
				return number;
			} catch (NumberFormatException nfe) {
				// Just to avoid crashing in the user's face.
			}
		}
	}

	private static void metodo1() throws Exception {
		System.out.println("Informe os dados do usuario.");
		String nome = null;
		String login = null;
		String rua = null;
		String numero = null;
		String bairro = null;
		String cidade = null;
		String estado = null;
		String complemento = null;
		
		while(true){
			System.out.print("Nome: ");
			try {
				nome = TratamentoDeErros.validaString(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Login: ");
			try {
				login = TratamentoDeErros.validaString(input.next());
				if (Cadastra.cadastro.containsKey(login)) {
					System.out.println("Login ja cadastrado.");
					continue;
				}
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Rua: ");
			try {
				rua = TratamentoDeErros.validaString(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Numero: ");
			try {
				numero = TratamentoDeErros.recebeSomenteNumeros(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Bairro: ");
			try {
				bairro = TratamentoDeErros.validaString(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Cidade: ");
			try {
				cidade = TratamentoDeErros.validaString(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Estado: ");
			try {
				estado = TratamentoDeErros.validaString(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		while(true){
			System.out.print("Complemento: ");
			try {
				complemento = TratamentoDeErros.validaString(input.next());
				break;
			}catch (Exception ex){
				System.out.println(ex.getMessage());
				continue;
			}
		}
		
		Endereco enderecoUsuario = new Endereco(rua,numero,bairro,cidade,estado,complemento);
		Usuario novoUsuario = new Usuario(nome,login,enderecoUsuario);
		sistema.cadastra(login, novoUsuario);
		
		System.out.println("\nCadastro efetuado com sucesso!\n" + novoUsuario.toString());
	}

	private static void metodo2() throws DadosInsuficientesExceptions, SomenteNumerosException {
		System.out.print("Digite o Login: ");
		String login = TratamentoDeErros.validaString(input.next());
		Usuario usuarioLogado = null;
		if (Cadastra.cadastro.containsKey(login)){
			usuarioLogado = Cadastra.acessaUsuario(login);
			metodo3(usuarioLogado);
		}else{
			System.out.println("Login nao encontrado.\n");
		}
	}

	private static void metodo3(Usuario usuarioLogado) throws DadosInsuficientesExceptions, SomenteNumerosException {
		
		input = new Scanner(System.in);

		printHeader();
		int opcao;

		do {
			printMenu2(usuarioLogado);
			opcao = readIntegerOption("> ", 1, NUMBER_OF_OPTIONS2);

			switch (opcao) {
			case 1:
				metodo11(null);
				break;
			case 2:
				metodo21();
				break;
			case 3:
				metodo31();
				break;
				
			default:

				break;
			}

		} while (opcao != NUMBER_OF_OPTIONS1);

		System.out.println("Obrigado!");

	}

	private static void metodo21() {
	System.out.println("Testeee");
		
	}

	private static void metodo31() {
		System.out.println("teste1");
		
	}

	private static void metodo11(Usuario UsuarioLogado) throws DadosInsuficientesExceptions, SomenteNumerosException {
		System.out.print("Digite o nome ou endereco do usuario que voce deseja encontrar: ");
		String stringProcura = TratamentoDeErros.validaString(input.next());
		ArrayList<Usuario> itensProcurados = Cadastra.procuraUsuario(stringProcura);
		System.out.println("Visualizar perfil(escolha um numero): ");
		//TODO
		while(true) {
			
		}
			
		}
//		String stringEscolha = TratamentoDeErros.recebeSomenteNumeros(input.next());
	}



